Zero de Função


Dada uma função f(x), encontre um x, tal que: f(x) = y0

  • Força bruta, testar todos valores dentro de um intervalo
  • Bissecção
  • Posição Falsa

  • ## Bissecção

  • ## Posição Falsa

Tem uma convergencia muito lenta.

$ g(x) = f(x) - y_0 = 0 $

[$x_a, x_b$] : intervalo

$y_a, y_b$ : tolerancia

$x_{med}$

Algoritmo:

$y = mx + c$

$m = (y_b - y_a)/(x_b - x_a) = y_{delta} / x_{delta}$

$y_a = ((y_b - y_a) / (x_b - x_a)) x + c$

$c = y_a - ((y_b - y_a) / (x_b - x_a)) x$

$c = (y_a*(x_b - x_a) - y_b * x_a + y_a * x_b) / (x_b - x_a)$

$x_{med} = ( (y_a*x_b) - (y_b*x_a) ) / (y_b - y_a)$


In [56]:
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt

def g(x):
    return x ** 3 + 3 * x - 5

# intervalos 
xa = 0
xb = 3
ya, yb = g(xa), g(xb)

# plot
x = np.linspace(xa, xb, 100)
y = g(x)

plt.plot(x,y)


Out[56]:
[<matplotlib.lines.Line2D at 0x10d871350>]

In [59]:
print('xa = %.6f\txb = %.6f\txm = %.6f' % (xa, xb, xm))

for i in range(5):
    if ym == 0:
        print('encontrou')
    elif (ya * ym) < 0:
        xb = xm
        yb = g(xm)
    else:
        xa = xm
        ya = g(xm)
    
    xm = (xb + xa) / 2.0
    ym = g(xm)

    plt.plot(x, y)
    plt.grid(True)
    plt.plot(xm, ym, 'ko')
    plt.plot([xa, xa], [-5, 30], 'k')
    plt.plot([xb, xb], [-5, 30], 'k')
    plt.plot([xm, xm], [-5, 30], 'k--')
    plt.show()
    
    
    print('%d) x = %f | error = %.6f' % (i, xm, (1.0 - xm)))
    print('xa = %.6f\txb = %.6f\txm = %.6f' % (xa, xb, xm))


xa = 1.152199	xb = 1.154499	xm = 1.153349
0) x = 1.153924 | error = -0.153924
xa = 1.153349	xb = 1.154499	xm = 1.153924
1) x = 1.154211 | error = -0.154211
xa = 1.153924	xb = 1.154499	xm = 1.154211
2) x = 1.154068 | error = -0.154068
xa = 1.153924	xb = 1.154211	xm = 1.154068
3) x = 1.154139 | error = -0.154139
xa = 1.154068	xb = 1.154211	xm = 1.154139
4) x = 1.154175 | error = -0.154175
xa = 1.154139	xb = 1.154211	xm = 1.154175

In [ ]:

  • ## Metodo de Illinois Auxilia a convergencia do metodo da posição falsa
if xa ou xb seja atualizado 2 vezes consecutivas
    aualizar o limite contrario por metade do intervalo atual

In [ ]: